package com.xiyuan.smartutils.control;

import com.xiyuan.smartutils.logging.LogFactory;
import com.xiyuan.smartutils.logging.Logger;

import java.util.HashMap;
import java.util.Map;

/**
 * 对象处理线程池控制器，指定池最小值、最大值、初始值，允许线程空闲时长和允许缓存对象大小<br>
 * <br>
 * 1.创建时创建初始值大小的线程池，创建对象队列，和主线程<br>
 * 2.其他线程通过post传递对象可执行对象<br>
 * 3.主线程调度线程池处理对象，并检查线程池空闲线程
 *
 * @version v1.0.0 @author lgz 2017-8-27 新建与整理
 */
public class HandlerController extends ThreaderController {
    private static final Logger log = LogFactory.getLogger(HandlerController.class);
    
    // 缺省处理器
    private Handler<?> defaultHandler = null;
    private final Map<Class<?>, Handler<?>> handlerMap = new HashMap<>();
    
    public HandlerController() {
        this(null);
    }
    
    public HandlerController(String id) {
        super(id);
        setThreadName(newName("Handler-"));
    }
    
    /*************************************************************************************************/
    // 创建&销毁，支持通过配置key=class,value=handler方式
    
    /*************************************************************************************************/
    
    @Override
    public boolean openBefore() {
        super.openBefore();
        return true;
    }
    
    @Override
    public void closeAfter() {
        super.closeAfter();
        
        defaultHandler = null;
        handlerMap.clear();
    }
    
    /*************************************************************************************************/
    // 增加&删除处理器
    /*************************************************************************************************/
    
    /**
     * 设置缺省处理器
     */
    public <T> void setDefaultHandler(Handler<T> handler) {
        defaultHandler = handler;
    }
    
    /**
     * 清除缺省处理器
     */
    public void clearDefaultHandler() {
        defaultHandler = null;
    }
    
    /**
     * 增加一个对象处理器
     */
    public <T> void addHandler(Class<T> requestClass, Handler<T> handler) {
        handlerMap.put(requestClass, handler);
    }
    
    /**
     * 删除一个对象处理器
     */
    public <T> void removeHandler(Class<T> requestClass) {
        handlerMap.remove(requestClass);
    }
    
    /*************************************************************************************************/
    // 公开的对象处理方法
    /*************************************************************************************************/
    
    /**
     * 处理一个事件，转化为Handlee由父类处理
     */
    public boolean execute(Object event) {
        return execute(event, false);
    }
    
    /**
     * 处理一个事件，并提供优先参数，转化为Handlee由父类处理
     */
    public boolean execute(Object event, boolean priority) {
        Handler<?> handler = handlerMap.get(event.getClass());
        if (handler == null) {
            handler = defaultHandler;
        }
        
        if (handler == null) {
            log.error(String.format("事件处理器[%s]未配置处理器", event.getClass().getName()));
            return false;
        }
        
        Handlee<?> command = new Handlee<>(event, handler);
        return super.execute(command, priority);
    }
}
